package xs.szw.common.utils;

import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * @program: My_SpringSecurity
 * @description: 文件处理工具类
 * @author: Songzw
 * @create: 2025-02-01 15:55
 **/
public class FileUtil {


    /**
     * 上传多个文件
     * @param multipartFiles 文件
     * @param savePath 保存路径前缀
     * @return
     */
    public  String[] fileUp(MultipartFile[] multipartFiles, String savePath) {
        if (multipartFiles == null || multipartFiles.length == 0) {
            return null;
        }
        String[] res = new String[multipartFiles.length];
        int index = -1;
        boolean isUploadFailed= false;
        for(MultipartFile multipartFile : multipartFiles){
            index++;
            if (multipartFile == null || multipartFile.isEmpty()) {
                continue;
            }
            //获取文件名(带后缀
            String fileName = multipartFile.getOriginalFilename();
            //验证是否重名
            fileName = this.getFileNameToAvoidRepeat(new File(savePath), fileName);
            //完整路径
            fileName = savePath + File.separator + fileName;
            res[index] = fileName;
            File file = new File(fileName);
            //如果文件目录不存在创建文件目录
            if (!file.exists()) {
                if (!file.mkdirs()) {
                    return null;
                }
            }
            try {
                multipartFile.transferTo(file);
            } catch (IllegalStateException | IOException e) {
                isUploadFailed =true;
            }
        }
        if(isUploadFailed) {
            return null;
        }
        return res;
    }

    /**
     * 上传单个文件
     * @param multipartFile 文件
     * @param savePath 保存路径前缀
     * @return
     */
    public String fileUp(MultipartFile multipartFile,String savePath){
        if (multipartFile == null || multipartFile.isEmpty()) {
            return null;
        }
        boolean isUploadFailed= false;
        String fileName = multipartFile.getOriginalFilename();
        //判断是否重名
        fileName = this.getFileNameToAvoidRepeat(new File(savePath), fileName);
        //完整路径
        fileName = savePath + File.separator + fileName;
        System.out.println(fileName);
        File file = new File(fileName);
        //如果文件目录不存在创建文件目录
        if (!file.exists()) {
            if (!file.mkdirs()) {
                return null;
            }
        }
        try {
            multipartFile.transferTo(file);
        } catch (IllegalStateException | IOException e) {
            isUploadFailed =true;
        }
        if(isUploadFailed) {
            return null;
        }
        return fileName;
    }



    /**
     * 避免上传文件将同名文件覆盖，发现同名文件时，将文件名后加上时间戳
     * @param file:目录
     * @param fileName:上传文件的文件名
     * @return
     */
    //同名文件验证
    private String getFileNameToAvoidRepeat(File file, String fileName){
        if(file.isDirectory()){
            //获取所在路径的文件列表
            File[] files = file.listFiles();
            for(File f : files){
                if(!f.isFile()) {
                    continue;
                }
                if(!f.getName().equals(fileName)) {
                    continue;
                }
                if(fileName.indexOf('.')==-1) {
                    //无扩展名
                    fileName = fileName + "(" + System.currentTimeMillis() + ")";
                }else {
                    //有扩展名
                    fileName = fileName.substring(0,fileName.lastIndexOf('.')-1)
                            + "(" + System.currentTimeMillis() + ")"
                            + fileName.substring(fileName.lastIndexOf('.'));
                }

            }
        }
        return fileName;
    }


    /**
     * 删除指定路径的文件
     * @param fileName 文件路径
     * @return
     */
    public boolean deleteFile(String fileName) {
        if (fileName == null || fileName.isBlank()) {
            return false;
        }
        File file = new File(fileName);
        if(!file.exists()) {
            return true;
        }
        if(file.isDirectory()) {              //如果是目录
            return cascadeDeleteFile(file);
        }else {                              //如果是文件
            return file.getAbsoluteFile().delete();   //返回删除结果
        }
    }


    /**
     * 删除目录
     * @param dir 文件
     * @return
     */
    public boolean cascadeDeleteFile(File dir){
        if (dir.isDirectory()) {
            String[] children = dir.list();
            //递归删除目录中的子目录
            for (String child : children) {
                boolean success = cascadeDeleteFile(new File(dir, child));
                if (!success) {
                    return false;
                }
            }
        }
        // 目录此时为空，可以删除
        return dir.delete();
    }

}
